package com.felix.sim.spring.boot.application;

import com.felix.sim.spring.boot.server.WebServer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;

import java.util.Map;

public class SimSpringApplication {

    /**
     * 在run方法中，我们要实现的逻辑如下：
     * 1.创建一个Spring容器
     * 2.创建建容器对象，如 Tomcat
     * 3.生成DispatcherServlet对象，并且和前面创建出来的Spring容器进行绑定
     * 4.将DispatcherServlet添加到Tomcat中
     * 5.启动容器
     * @param clazz
     */
    public static void run(Class clazz) {
        // 1. 创建 Spring 容器
        AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
        applicationContext.register(clazz);
        applicationContext.refresh();

        // 2. 启动容器
        WebServer webServer = getWebServer(applicationContext);
        webServer.start(applicationContext);
    }

    public static WebServer getWebServer(AnnotationConfigWebApplicationContext applicationContext) {
        // key为beanName, value为Bean对象
        Map<String, WebServer> webServers = applicationContext.getBeansOfType(WebServer.class);

        if (webServers.isEmpty()) {
            throw new NullPointerException();
        }
        if (webServers.size() > 1) {
            throw new IllegalStateException();
        }

        // 返回唯一的一个
        return webServers.values().stream().findFirst().get();
    }

}
